pragma License (GPL);
--
-- drk-bigrat-complex.adb
--
-- Copyright (C) 2012 - Thibault BUREL
--
-- This file is part of DRK.BigRat.
--
-- DRK.BigRat is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- DRK.BigRat is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with DRK.BigRat.  If not, see <http://www.gnu.org/licenses/>
--

package body DRK.BigRat.Complex is

   function "+" (Left, Right : in Instance) return Instance
   is
      Result : Instance;
   begin
      Result.R := Left.R + Right.R;
      Result.I := Left.I + Right.I;

      return Result;

   end "+";

   function "-" (Left, Right : in Instance) return Instance
   is
      Result : Instance;
   begin
      Result.R := Left.R - Right.R;
      Result.I := Left.I - Right.I;

      return Result;

   end "-";

   function "*" (Left, Right : in Instance) return Instance
   is
      Result : Instance;
   begin
      Result.R := Left.R * Right.R - Left.I * Right.I;
      Result.I := Left.R * Right.I + Left.I * Right.R;

      return Result;

   end "*";

   function "/" (Left, Right : in Instance) return Instance
   is
      Result : Instance;
      Den    : BigRat.Instance;
   begin
      Den := (Right.R * Right.R + Right.I * Right.I);

      Result.R := (Left.R * Right.R + Left.I * Right.I) / Den;
      Result.I := (Left.I * Right.R - Left.R * Right.I) / Den;

      return Result;

   end "/";

   function Init (Re, Im : in Natural) return Instance
   is
      New_Complex : Instance;
   begin
      New_Complex.R := BigRat.Init (Re, 1);
      New_Complex.I := BigRat.Init (Im, 1);

      return New_Complex;

   end Init;

end DRK.BigRat.Complex;
